package es.acaixa.epersistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Vector;

import es.acaixa.cnegocios.Produto;
import es.acaixa.fexcecoes.ProdutoExistenteException;
import es.acaixa.fexcecoes.ProdutoInexistenteException;

public class RepositorioProduto {
	
	private Connection con;
	
	public RepositorioProduto(){
		this.con = new ConnectionFactory().getConnection();
	}

	public void cadastrar(Produto novoProduto) throws ProdutoExistenteException, Exception {
		try{
			if(!consultarBooleano(novoProduto.getNome())){
				String sql = "insert into produto (nome, tipo, preco, descricao)" +
						"values (?,?,?,?)";
				PreparedStatement stmt = con.prepareStatement(sql);
				
				stmt.setString(1, novoProduto.getNome());
				stmt.setString(2, novoProduto.getTipo());
				stmt.setDouble(3, novoProduto.getPreco());
				stmt.setString(4, novoProduto.getDescricao());
				stmt.execute();
				stmt.close();
				
			}else{
				throw new ProdutoExistenteException(novoProduto.getNome());
			}
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}
	
	public Produto consultar(int id) throws ProdutoInexistenteException, Exception{
		
		Produto produto = new Produto();
		
		try{
			PreparedStatement stmt = con.prepareStatement("select * from produto where id=?");
			stmt.setInt(1, id);
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				if(rs.getInt("id") == id){
					produto.setNome(rs.getString("nome"));
					produto.setPreco(rs.getDouble("preco"));
					produto.setTipo(rs.getString("tipo"));
					produto.setDescricao(rs.getString("descricao"));
					produto.setDisponivel(rs.getBoolean("disponibilidade"));
					return produto;
				}else{
					throw new ProdutoInexistenteException(id);
				}
			}
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
		return null;
	}
	
	public boolean consultarBooleano(String nome) throws ProdutoInexistenteException, Exception{
		try{
			PreparedStatement stmt = con.prepareStatement("select * from produto");
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				if(rs.getString("nome").equals(nome)){
					return true;
				}else{
					return false;
				}
			}
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
		return false;
	}
	
	public boolean consultarBooleano(int id) throws ProdutoInexistenteException, Exception{
		try{
			PreparedStatement stmt = con.prepareStatement("select * from produto where id=?");
			stmt.setInt(1, id);
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				if(rs.getInt("nome") == id){
					return true;
				}else{
					throw new ProdutoInexistenteException(id);
				}
			}
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
		return true;
	}
	
	public void remover(int id) throws ProdutoInexistenteException, Exception {
		try{
			String sql = "delete from produto where id=?";
			if(consultar(id) != null){
				PreparedStatement stmt = con.prepareStatement(sql);
				stmt.setInt(1, id);
				
				stmt.execute();
				stmt.close();
			}else{
				throw new ProdutoInexistenteException(id);
			}
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}
		
	public void atualizar(int id, Produto novoProduto) throws ProdutoInexistenteException, Exception {
		try{
			String sql = "update produto set nome=?, tipo=?, preco=?, descricao=?, disponibilidade=? where cpf=?";
			
			if(consultarBooleano(id)){
				PreparedStatement stmt = con.prepareStatement(sql);
				stmt.setString(1, novoProduto.getNome());
				stmt.setString(2, novoProduto.getTipo());
				stmt.setDouble(3, novoProduto.getPreco());
				stmt.setString(4, novoProduto.getDescricao());
				stmt.execute();
				stmt.close();
			}else{
				throw new ProdutoInexistenteException(id);
			}
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
		
	}

	public List<Produto> listar() {
		List<Produto> arrayProdutos = new Vector<Produto>();

		try{
			String sql = "select * from produto";
			PreparedStatement stmt = con.prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				Produto produto = new Produto();
				produto.setDescricao(rs.getString("descricao"));
				produto.setDisponivel(rs.getBoolean("disponibilidade"));
				produto.setNome(rs.getString("nome"));
				produto.setPreco(rs.getDouble("preco"));
				produto.setTipo(rs.getString("tipo"));
				arrayProdutos.add(produto);
			}
			rs.close();
			stmt.close();
			return arrayProdutos;
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}

	public void setDisponibilidade(boolean var, int id) throws ProdutoInexistenteException, SQLException, Exception {
		if(consultarBooleano(id)){
			String sql = "update produto disponibilidade=? where id=?";
			PreparedStatement stmt = con.prepareStatement(sql);
			stmt.setBoolean(1, var);
			stmt.setInt(2, id);
			stmt.execute();
			stmt.close();
		}
	}
	
	public void fecharConta(int idMesa){
		
	}

}


